package ar.frba.utn.diseñosistemas.TP2;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

public class Itinerario {
	
	private ArrayList<Asiento> asientos;
	
	public Itinerario(){
		this.asientos = new ArrayList<Asiento>();
	}
	
	public ArrayList<Asiento> getAsientos(){
		return this.asientos;
	}
	
	public Itinerario addAsiento(Asiento asiento){
		this.asientos.add(asiento);
		return this;
	}
	
	public Itinerario setAsientos(ArrayList<Asiento> asientos){
		this.asientos = asientos;
		return this;
	}

	public boolean tieneReservas() 
	{
		for (Asiento asiento : getAsientos()) 
		{
			if (asiento.estaReservado())
				return true;
		}
		
		return false;
	}
	
	public float getPrecio()
	{
		float total = 0;
		
		for (Asiento asiento : getAsientos()) 
			total += asiento.getPrecio();
		
		return total;
	}
	
	public long getTiempoDeVuelo()
	{
		long tiempoTotal = 0;
		
		for (int i = 0; i < asientos.size(); i++) 
		{
			tiempoTotal += asientos.get(i).getTiempoDeVuelo();
			if (i < asientos.size() - 1)
			{
				tiempoTotal += calcularDiferenciaEscala(asientos.get(i).getFechaLlegada(), asientos.get(i).getHoraLlegada(), asientos.get(i).getFechaSalida(), asientos.get(i).getHoraSalida());
			}
		}
		
		return tiempoTotal;
	}
	
	public long calcularDiferenciaEscala(String fechaLlegada,String  horaLlegada,String  fechaSalida,String horaSalida)
	{
		try
		{
			SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
			Date salida = format.parse(fechaSalida + " " + horaSalida);
			Date llegada = format.parse(fechaLlegada + " " + horaLlegada);
			return Math.abs(salida.getTime() - llegada.getTime());
		}
		catch(Exception ex)
		{
			throw new RuntimeException("No se pudo calcular el tiempo de vuelo");
		}
	}

	public boolean tieneAlgunaReserva()
	{
		for (Asiento asiento : getAsientos())
		{
			if(asiento.estaReservado())
				return true;
		}
		
		return false;
		//Lambdaj
		//Google collections
		//Apache commons collections
	}
	
	public int getPopularidad() 
	{
		int total = 0;
		
		for (Asiento asiento : getAsientos()) 
			total += asiento.getPopularidadVuelo();
		
		return total;
	}
}
